package main

import (
	"fmt"
	"io"
	"os"
)

// 在文件中间添加内容
const fileSrc = "./demo.txt"

func f1() {
	// 打开文件
	fileObj, err := os.OpenFile(fileSrc, os.O_RDWR, 0644)
	if err != nil {
		fmt.Println("openfile err:", err)
		return
	}
	// 创建临时文件
	tmpFile, err := os.OpenFile("./sb.tmp", os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0644)
	if err != nil {
		fmt.Println("openfile err:", err)
		return
	}
	defer tmpFile.Close()

	// 读取文件写入临时文件
	var ret [1]byte
	n, err := fileObj.Read(ret[:])
	if err != nil {
		fmt.Printf("read file err: %v\n", err)
		return
	}

	// 源文件插入之前的文本写入临时文件
	tmpFile.Write(ret[:n])
	// 写入要插入的内容
	var str = []byte{'^'}
	tmpFile.Write(str)
	// 源文件插入之后的文本写入临时文件
	var ss [1024]byte
	for {
		n, err := fileObj.Read(ss[:])
		if err == io.EOF {
			tmpFile.Write(ss[:n])
			break
		}
		if err != nil {
			fmt.Println("read file err:", err)
			return
		}
		tmpFile.Write(ss[:n])
	}

	// 关闭源文件
	fileObj.Close()
	tmpFile.Close()

	// 重命名临时文件
	os.Rename("./sb.tmp", "./sb.txt")
}
func f2() {
	fileObj, err := os.OpenFile("./demo.txt", os.O_RDWR, 0644)
	if err != nil {
		return
	}
	defer fileObj.Close()

	// func (f *File) Seek(offset int64, whence int) (ret int64, err error)
	// Seek设置下一次读/写的位置。offset为相对偏移量，
	// 而whence决定相对位置：0为相对文件开头，1为相对当前位置，2为相对文件结尾。
	// 它返回新的偏移量（相对开头）和可能的错误。
	fileObj.Seek(2, 0) // 从文件开头第二个字节插入光标

	// 正常读取文件
	var ss [1024]byte
	n, err := fileObj.Read(ss[:])
	if err == io.EOF {
		fmt.Println("")
	}
	fmt.Printf("%v\n", string(ss[:n]))
}
func main() {
	// f1()
	f2()
}
